#include "../source/server.hpp"

void OnConnected(const PtrConnection &conn) {
    DBG_LOG("NEW CONNECTION:%p", conn.get());
}
void OnClosed(const PtrConnection &conn) {
    DBG_LOG("CLOSE CONNECTION:%p", conn.get());
}
void OnMessage(const PtrConnection &conn, Buffer *buf) {
    DBG_LOG("%s", buf->ReadPosition());
    buf->MoveReadOffset(buf->ReadAbleSize());
    std::string str = "Hello World";
    conn->Send(str.c_str(), str.size());
}
int main()
{
    TcpServer server(8000);
    server.SetThreadCount(2);
    //server.EnableInactiveRelease(10);
    server.SetCloseCallback(OnClosed);
    server.SetConnectedCallback(OnConnected);
    server.SetMessageCallback(OnMessage);
    server.Start();
    return 0;
}



































// // void HandleClose(Channel *channel){
// //     // std::cout << "close: " << channel->Fd() << std::endl;
// //     DBG_LOG("close :%d",channel->Fd());
// //     channel->Remove();
// //     delete channel;
// // }

// // void HandleRead(Channel *channel){
// //     int fd = channel->Fd();
// //     char buf[1024] = {0};
// //     int ret = recv(fd,buf,1023,0);
// //     if(ret <= 0){
// //         return HandleClose(channel);
// //     }
// //     // std::cout << buf << std::endl;
// //     DBG_LOG("%s",buf);
// //     channel->EnableWrite();

// // }
// // void HandleWrite(Channel *channel){
// //     int fd = channel->Fd();
// //     const char *buf = "你好阿姨!!!";
// //     int ret = send(fd,buf,strlen(buf),0);
// //     if(ret < 0){
// //         HandleClose(channel);
// //     }
// //     channel->DisableWrite();
// // }


// // void HandleError(Channel *channel){
// //     return HandleClose(channel);
// // }
// // void HandleEvent(EventLoop *loop,Channel *channel,uint64_t timerid){
// //     // std::cout << "有一个事件" << std::endl;
// //     loop->TimerRefresh(timerid);
// // }
// uint64_t conn_id = 0;
// // EventLoop loop;
// std::unordered_map<uint64_t,PtrConnection> _conns;
// std::vector<LoopThread> threads(2);
// int next_loop = 0;
// LoopThreadPool *loop_pool;
// EventLoop base_loop;

// void ConnectionDestory(const PtrConnection &conn){
//     _conns.erase(conn->Id());
// }
// void OnConnected(const PtrConnection &conn){
//     DBG_LOG("new connection:%p",conn.get());
// }
// void OnMessage(const PtrConnection &conn,Buffer *buf){
//     DBG_LOG("%s",buf->ReadPosition());
//     buf->MoveReadOffset(buf->ReadAbleSize());
//     std::string str = "hello client!!!";
//     conn->Send(str.c_str(),str.size());
//     // conn->Shutdown();
// }

// void HandleNewConnection(int newfd){
//     // int lst_fd = lst_channel->Fd();
//     // int newfd = accept(lst_fd,NULL,NULL);
//     // if(newfd < 0){
//     //     return;
//     // }
//     conn_id++;
//     // next_loop = (next_loop + 1) % 2;
//     // PtrConnection conn(new Connection(threads[next_loop].GetLoop(),conn_id,newfd));
//     PtrConnection conn(new Connection(loop_pool->NextLoop(),conn_id,newfd));
//     conn->SetConnectedCallback(std::bind(OnConnected,std::placeholders::_1));
//     conn->SetMessageCallback(std::bind(OnMessage,std::placeholders::_1,std::placeholders::_2));
//     conn->SetSrvCloseCallback(std::bind(ConnectionDestory,std::placeholders::_1));
//     conn->EnableInactiveRelease(10);//启动非活跃超时销毁功能
//     conn->Established();//就绪初始化
//     _conns.insert(std::make_pair(conn_id,conn));
//     DBG_LOG("new connection yijing anpai");
//     //非活跃连接的超时释放操作,10s后关闭连接
//     //注意:定时销毁任务,必须在启动读事件之前,因为有可能启动了事件监控后,立即有了事件,但是这时候还没有任务
//     // loop->TimerAdd(timerid,10,std::bind(HandleClose,channel));
//     // channel->EnableRead();//新连接开启读事件监听
// }


// int main ()
// {
//     // srand(time(NULL));
//     loop_pool = new LoopThreadPool(&base_loop);
//     loop_pool->SetThreadCount(2);
//     loop_pool->Create();
//     Acceptor acceptor(&base_loop,8000);
//     acceptor.SetAcceptCallback(std::bind(HandleNewConnection,std::placeholders::_1));
//     acceptor.Listen();
//     base_loop.Start();
//     // while(1){
//     //     base_loop.Start();
//     // }
//     delete loop_pool;
//     return 0;
// }





// // int main ()
// // {
// //     // Poller poller;
// //     // srand(time(NULL));
// //     // EventLoop loop;
// //     // Socket lis_sock;//_sockfd = 1
// //     // lis_sock.CreateServer(8000);
// //     // //为监听套接字,创建一个Channel对象进行事件的管理,以及事件的处理
// //     // Channel channel(&loop,lis_sock.Fd());
// //     // //设置监听套接字的读事件回调函数,当有新链接到来触发读事件就会去执行这个函数
// //     // channel.SetReadCallback(std::bind(Acceptor,&loop,&channel));
// //     // channel.EnableRead();//将 监听套接字:读事件 设置进epoll红黑树中进行监控
// //     // while(1){
// //     //     loop.Start();
// //     // }
// //     //DBG_LOG("创建服务器套接字失败");
// //     // while(1){
// //     //     int newfd = lis_sock.Accept();
// //     //     DBG_LOG("阻塞");
// //     //     //DBG_LOG("获取到一个新连接");
// //     //     //sleep(5);
// //     //     if(newfd < 0)
// //     //         continue;
// //     //     Socket cli_sock(newfd);//获取新链接创建出来的通信套接字
// //     //     DBG_LOG("获取到一个新连接");
// //     //     char buf[1024] = {0};
// //     //     int ret = cli_sock.Recv(buf,1023);
// //     //     if(ret < 0){
// //     //         cli_sock.Close();
// //     //         continue;
// //     //     }
// //     //     //读取到客户端的数据以后发送回去,踢皮球
// //     //     cli_sock.Send(buf,ret);
// //     //     cli_sock.Close();
// //     // }
// //     lis_sock.Close();
// //     return 0;
// // }
